import { uploadWhiteList } from "@midwayjs/upload";
import { tmpdir } from "os";
import { join } from "path";

// export type Dialect = "mysql" | "postgres" | "sqlite" | "mariadb" | "mssql" | "db2" | "snowflake" | "oracle";

export type PartitionerType = 0 | 1 | 2
/**
 * 数据配置类
 * @see {@link Config}
 * @anthor Jn
 */
export default class Config {

    /**
     * csrf安全配置
     */
    public static readonly SECURITY = {
        /**
         * xframe安全插件
         */
        xframe: {
            /**
             * 是否开启xframe插件
             */
            enable: false,
        },
        /**
         * csp安全插件
         */
        csp: {
            /**
             * 是否开启csp插件
             */
            enable: false,
        },
        /**
         * csrf安全插件
         */
        csrf: {
            /**
             * 设置请求头
             */
            headerName: "x-csrf-token",
            /**
             * get请求携带参数
             */
            queryName: "_csrf",
            /**
             * post请求携带参数
             */
            bodyName: "_csrf",
            /**
             * 白名单
             */
            refererWhiteList: ["*"],
            /**
             * 是否开启安全插件csrf
             */
            enable: false,
        },
        /**
         * 白名单
         */
        domainWhiteList: ["*"]
    }
    /**
     * JWT安全密钥配置
     */
    public static readonly JWT = {
        /**
         * TOKEN key
         */
        secret: "jn10013108 ^_^",
        /**
         * 过期时间
         */
        sign: {
            expiresIn: "30m"
        },
        verify: {
            // verifyOptions
        },
        decode: {
            // decodeOptions
        }
    }
    /**
     * 跨域配置
     */
    public static readonly CORS = {
        /**
         * 允许跨域请求地址
         */
        origin: "*",
        /**
         * 允许跨域请求的方法
         */
        allowMethods: "GET,HEAD,PUT,POST,DELETE,PATCH",
        /**
         * 允许请求携带Cookie
         */
        credentials: true
    }
    /**
     * redis 基础配置
     */
    public static readonly READIS = {
        clients: {
            client1: {
                host: "localhost",
                port: "6379",
                password: "",
                db: 0,
            },
            // instance2: {
            //     host: "host",
            //     port: "port",
            //     password: "password",
            //     db: "db",
            // },
        },
    }

    /**
     * redis 基础配置
     */
    public static readonly READISBASE = {
        /**
         * redis配置
         */
        redis: {
            /**
             * 存储时间 60s
             */
            expire: 60,
            /**
             * 存储模式
             */
            mode: "EX"
        },
    }

    /**
     * 验证码配置
     */
    public static readonly CAPTCHA = {
        /**
        * 字符长度
        */
        size: 4,
        /**
         * 字体大小
         */
        fontSize: 50,
        /**
         * 过滤字符
         */
        ignoreChars: "0oli",
        /**
         * 宽度
         */
        width: 100,
        /**
         * 高度
         */
        height: 40,
        /**
         * 干扰条数
         */
        noise: 4,
        /**
         * 字体颜色
         */
        color: true,
        /**
         * 背景颜色
         */
        background: "#ffffff",
        /**
         * 最小数
         */
        mathMin: 1,
        /**
         * 最大数
         */
        mathMax: 9,
    }

    /**
     * 文件配置
     */
    public static readonly MULTIPART = {
        /**
         * 文件上传模式
         */
        mode: "file",
        /**
         * 文件大小
         */
        fieldSize: "10mb",
        /**
         * 上传文件白名单
         */
        whitelist: uploadWhiteList.filter(ext => ext !== ".pdf"),
        // tmpdir: string，上传的文件临时存储路径
        tmpdir: join(tmpdir(), "midway-upload-files"),
        // cleanTimeout: number，上传的文件在临时目录中多久之后自动删除，默认为 5 分钟
        cleanTimeout: 5 * 60 * 1000,
        // base64: boolean，设置原始body是否是base64格式，默认为false，一般用于腾讯云的兼容
        base64: false,
        // 仅在匹配路径到 /api/upload 的时候去解析 body 中的文件信息
        match: /\/api\/upload/,
    }

    /**
     * axios配置
     */
    public static readonly Axios = {
        default: {
            // 所有实例复用的配置
        },
        clients: {
            default: {
                // 默认实例
                baseURL: "http://localhost:7001",
                // `headers` are custom headers to be sent
                headers: {
                    "X-Requested-With": "XMLHttpRequest"
                },
                timeout: 1000, // default is `0` (no timeout)

                // `withCredentials` indicates whether or not cross-site Access-Control requests
                // should be made using credentials
                withCredentials: false, // default
            },
            customAxios: {
                // 自定义实例
            }
        }
    }

    /**
     * 项目运行配置
     */
    public static readonly Koa = {
        port: 7001,
        // http2: true,
        globalPrefix: "/api/v1",
        // proxy:""
    }

    /**
     * socket.io 配置
     */
    public static readonly socketIO = {
        transports: ["websocket"],
        path: "/nJ",
        cors: {
            origin: "http://127.0.0.1:7001",
            methods: ["GET", "POST"]
        }
        // adapter:
        // connectTimeout:
    }

    /**
     * swagger 文档配置
     */
    public static readonly SwaggerDoc = {
        auth: {
            authType: "bearer",
        },
    }

    public static readonly User = {
        /**
         * 密码配置
         */
        password: {
            /**
             * 密码最大错误次数
             */
            maxRetryCount: 5,
            /**
             * 密码锁定时间（默认10分钟）
             */
            lockTime: 10
        },
        /**
         * 正则匹配式
         */
        BCRYPT_PATTERN: /\$2(a|y|b)?\$(\d\d)\$[./0-9A-Za-z]{53}/,

        /**
         * 密码加密位数
         */
        GENSALT_DEFAULT_LOG2_ROUNDS: 10,
        /**
         * URL 地址验证
         */
        START_WITH_HTTP: /^(http:\/\/|https:\/\/)/
    }


    /**
     * 项目相关配置
     */
    public static readonly JnConfig = {
        /**
         * 名称
         */
        name: "Jiangnian",
        /**
         * 版本
         */
        version: "1.0.0",
        /**
         * 版本年份
         */
        copyrightYear: 2024,
        /**
         * 文件路径
         */
        profile: "D:/JiangNian",
        /**
         * 获取ip地址
         */
        addressEnabled: false,
        /**
         * 验证码类型 math 数组计算 char 字符验证
         */
        captchaType: "math"
    }
    static readonly Info = {
        infoPath: '/_my_info',
    }
}
